// 执行动作的判空
export function executeRecursion(objOrArr) {
  let falg = false;
  let executeValue = ""; //保存选择项的value 消息通知/设备输出
  // 存储空字段的数组
  const emptyList = [];

  function recursion(data) {
    // 一层 判断是否是数组类型 不是则转化一下
    if (data instanceof Object) {
      Object.keys(data).forEach(item => {
        // 存储最外层选择的是什么
        if (item === "executeValue") {
          executeValue = data[item];
        } else if (item === "facilityInfo") {
          //不做处理 此字段的值来自接口  部分为空值 直接进if跳过检测
        }

        // 如果遍历的这次的对象 是否属于数组/对象
        else if (data[item] instanceof Object || data[item] instanceof Array) {
          // 需要规避的字段
          if (executeValue === 1 && item === "facilityMoreOption") {
            //不做处理   因为选择了消息通知 所以需要忽略facilityMoreOption对象下的遍历判空
          } else if (executeValue === 2 && item === "informMoreOption") {
            //同理
          } else {
            //跳过规避字段后的，才递归调用 进入内层循环
            recursion(data[item]);
          }
        }

        // 如果不是数组/对象 应该就剩字符串了 判断其是否有值
        else {
          if (
            data[item] === "" ||
            data[item] == undefined ||
            data[item] == null
          ) {
            //如果没有值 就做相应处理并return
            falg = true;
            emptyList.push(data[item]);
            return;
          }
        }
      });
    }

    // 如果是数组 则直接进行遍历
    else if (data instanceof Array) {
      data.forEach(item => {
        // 再次判断遍历的item  是否属于数组/对象
        if (item instanceof Object || item instanceof Array) {
          recursion(item); //如果是 则递归调用 进入内层循环
        }
        // 这个数据结构的数组里面的item都是Obj，所以每次进来这个if分支 都会递归到对象处理中去 所以不需要在这里也判断字段值为空 因为数组的item不会有普通数据类型
      });
    }
  }

  // 开始递归判空
  recursion(objOrArr);
  return falg;
}

// 触发器的递归判空
export function triggerConditionRecursion(objOrArr) {
  let falg = false;
  let triggerConditionValue = ""; //保存选择项的value
  let facilityTypeValue = ""; //保存子级选项的value
  // 存储空字段的数组
  const emptyList = [];

  function recursion(data) {
    // 一层 判断是否是数组类型 不是则转化一下
    if (data instanceof Object) {
      Object.keys(data).forEach(item => {
        // 存储最外层选择的是什么
        if (item === "triggerConditionValue") {
          triggerConditionValue = data[item];
        }
        // 存储子集 的下拉选项
        else if (item === "facilityTypeValue") {
          facilityTypeValue = data[item];
        } else if (item === "facilityInfo") {
          //不做处理 此字段的值来自接口  部分为空值 直接进if跳过检测
        } else if (item === "specificFacilityTypeOptions") {
          //不做处理 此字段的值来自接口  部分为空值 直接进if跳过检测
        }

        // 如果遍历的这次的对象 是否属于数组/对象
        else if (data[item] instanceof Object || data[item] instanceof Array) {
          // 需要规避的字段
          if (
            triggerConditionValue === 1 &&
            (item === "facilityMoreOption" ||
              item === "cronMoreOption" ||
              item === "scencMoreOption")
          ) {
            //不做处理   因为选择了手动触发   所以需要忽略facilityMoreOption、cronMoreOption、scencMoreOption对象下的遍历判空
          } else if (
            triggerConditionValue === 2 &&
            (item === "facilityMoreOption" || item === "scencMoreOption")
          ) {
            //同理
          } else if (
            triggerConditionValue === 3 &&
            (item === "cronMoreOption" || item === "scencMoreOption")
          ) {
            //同理
          }
          // 如果选择了上线/离线 则规避  属性/事件/功能对应的的属性列表
          else if (
            triggerConditionValue === 3 &&
            (facilityTypeValue === 1 || facilityTypeValue === 2) &&
            item === "moreOption"
          ) {
            //同理
          } else if (
            triggerConditionValue === 4 &&
            (item === "cronMoreOption" || item === "facilityMoreOption")
          ) {
            //同理
          } else {
            // 特殊处理当字段为数组类型但子级不是对象时
            if (data[item] instanceof Array && data[item].length === 0) {
              falg = true;
              emptyList.push(data[item]);
              return;
            }
            //跳过规避字段后及特殊处理的数组类型时，才递归调用 进入内层循环
            recursion(data[item]);
          }
        }

        // 如果不是数组/对象 应该就剩字符串了 判断其是否有值
        else {
          if (
            data[item] === "" ||
            data[item] == undefined ||
            data[item] == null ||
            (data[item] instanceof Array && data[item].length === 0)
          ) {
            //如果没有值 就做相应处理并return
            falg = true;
            emptyList.push(data[item]);
            console.log(
              "这里是空的",
              "来源：",
              data,
              "键名：",
              item,
              "值：",
              data[item]
            );
            return;
          }
        }
      });
    }

    // 如果是数组 则直接进行遍历
    else if (data instanceof Array && data.length > 0) {
      data.forEach(item => {
        // 再次判断遍历的item  是否属于数组/对象
        if (item instanceof Object || item instanceof Array) {
          recursion(item); //如果是 则递归调用 进入内层循环
        }
        // 这个数据结构的数组里面的item都是Obj，所以每次进来这个if分支 都会递归到对象处理中去 所以不需要在这里也判断字段值为空 因为数组的item不会有普通数据类型
      });
    }
  }

  // 开始递归判空
  recursion(objOrArr);
  return falg;
}
